package database

import (
	"fmt"
	"log"
	"sync"
	"time"

	"ser1/config"

	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"gorm.io/gorm/logger"
)

var (
	db   *gorm.DB
	once sync.Once
)

func GetDB() *gorm.DB {
	once.Do(func() {
		var err error
		dbUser := config.GetField("DB_USER")
		dbPassword := config.GetField("DB_PASSWORD")
		dbName := config.GetField("DB_NAME")
		dbHost := config.GetField("DB_HOST")
		dbPort := config.GetField("DB_PORT")

		// 检查数据库配置是否完整
		if dbUser == "" || dbPassword == "" || dbName == "" || dbHost == "" || dbPort == "" {
			log.Fatal("数据库配置不完整，请检查环境变量或.env文件中是否设置了DB_USER、DB_PASSWORD、DB_NAME、DB_HOST和DB_PORT")
		}

		dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8mb4&parseTime=True&loc=Local", dbUser, dbPassword, dbHost, dbPort, dbName)
		fmt.Print("数据库连接字符串:", dsn)
		
		// 配置GORM日志级别
		logLevel := logger.Silent
		if config.GetField("DB_LOG_MODE") == "1" {
			logLevel = logger.Info // 打印所有SQL语句
		}
		
		db, err = gorm.Open(mysql.Open(dsn), &gorm.Config{
			Logger: logger.Default.LogMode(logLevel),
		})
		if err != nil {
			log.Fatalf("连接数据库失败: %v", err)
		}

		// 配置连接池
		sqlDB, err := db.DB()
		if err != nil {
			log.Fatalf("获取数据库连接池失败: %v", err)
		}

		// 设置最大空闲连接数
		sqlDB.SetMaxIdleConns(20)

		// 设置最大打开连接数
		sqlDB.SetMaxOpenConns(250)

		// 设置连接的最大可复用时间
		sqlDB.SetConnMaxLifetime(10 * time.Minute)
		
		// 设置连接最大空闲时间
		sqlDB.SetConnMaxIdleTime(5 * time.Minute)
	})
	return db
}

func AutoMigrateTables(models ...interface{}) {
	db := GetDB()
	if err := db.AutoMigrate(models...); err != nil {
		log.Fatalf("自动迁移表结构失败: %v", err)
	}
}